package com.xuecheng.media.service.jobhandler;

import com.xuecheng.base.exception.XueChengPlusException;
import com.xuecheng.base.utils.Mp4VideoUtil;
import com.xxl.job.core.context.XxlJobHelper;
import com.xxl.job.core.handler.annotation.XxlJob;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.io.File;
import java.io.IOException;

/**
 * 任务处理类
 */
@Slf4j
@Component
public class VideoTask {

    //ffmpeg的路径
    @Value("${videoprocess.ffmpegpath}")
    private String ffmpegpath;

    /**
     * 视频处理任务
     */
    @XxlJob("videoJobHandler")
    public void videoJobHandler() throws Exception {

        // 分片参数
        int shardIndex = XxlJobHelper.getShardIndex();//执行器的序号，从0开始
        int shardTotal = XxlJobHelper.getShardTotal();//执行器总数

        //确定cpu的核心数
        int processors = Runtime.getRuntime().availableProcessors();
        //查询待处理的任务
//        List<MediaProcess> mediaProcessList = mediaFileProcessService.getMediaProcessList(shardIndex, shardTotal, processors);

        //任务数量
//        int size = mediaProcessList.size();

        //自定义线程池

        //下载minio视频到本地

        //将avi视频转为mp4

        //转码后视频上传到minio

        //更新媒资数据表中的url

        //待处理任务删除，转到历史任务表
    }

    /**
     * 视频转码
     *
     * @param fileId 文件id
     * @param file   avi文件
     * @return MP4文件
     */
    private File transcodingVideo(String fileId, File file) {
        //源avi视频的路径
        String videoPath = file.getAbsolutePath();
        //转换后mp4文件的名称
        String mp4Name = fileId + ".mp4";
        //转换后mp4文件的路径
        //先创建一个临时文件，作为转换后的文件
        File mp4File = null;
        try {
            mp4File = File.createTempFile("minio", ".mp4");
        } catch (IOException e) {
            XueChengPlusException.cast("创建临时文件失败");
        }
        String mp4Path = mp4File.getAbsolutePath();
        //创建工具类对象
        Mp4VideoUtil videoUtil = new Mp4VideoUtil(ffmpegpath, videoPath, mp4Name, mp4Path);

        //开始视频转换，成功将返回success,失败返回失败原因
        String result = videoUtil.generateMp4();
        if (!result.equals("success")) {
            log.error("视频转码失败,原因:{}", result);
            XueChengPlusException.cast("视频转码失败");
        }
        return mp4File;
    }

    private String getFilePath(String fileMd5, String fileExt) {
        return fileMd5.substring(0, 1) + "/" + fileMd5.substring(1, 2) + "/" + fileMd5 + "/" + fileMd5 + fileExt;
    }
}
